package it.unisa.unibox.bridge;

import it.unisa.unibox.beans.AltroProdotto;
import it.unisa.unibox.beans.ArticoloLibro;
import it.unisa.unibox.beans.ArticoloRivista;
import it.unisa.unibox.beans.AttiCongresso;
import it.unisa.unibox.beans.Brevetto;
import it.unisa.unibox.beans.Curatela;
import it.unisa.unibox.beans.Monografia;
import it.unisa.unibox.beans.Prodotto;

import java.sql.SQLException;
import java.util.ArrayList;

public interface IProdottiManager extends IManager {

	/**
	 * RF 1.1 e 1.2 inserimento prodotto Altro
	 * @param ap il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	public int inserisciAltroProdotto(AltroProdotto ap)throws SQLException;

	/**
	 * RF 1.1 e 1.2 inserimento prodotto ArticoloLibro
	 * @param al il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	public int inserisciArticoloLibro(ArticoloLibro al)throws SQLException;

	/**
	 * RF 1.1 e 1.2 inserimento prodotto ArticoloRivista
	 * @param ar il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	public int inserisciArticoloRivista(ArticoloRivista ar)throws SQLException;

	/**
	 * RF 1.1 e 1.2 inserimento prodotto Monografia
	 * @param m il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	public int inserisciMonografia(Monografia m)throws SQLException;

	/**
	 * RF 1.1 e 1.2 inserimento prodotto Curatela
	 * @param c il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	public int inserisciCuratela(Curatela c)throws SQLException;

	/**
	 * RF 1.1 e 1.2 inserimento prodotto AttiCongresso
	 * @param ac il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	public int inserisciAttiCongresso(AttiCongresso ac)throws SQLException;

	/**
	 * RF 1.1 e 1.2 inserimento prodotto Brevetto
	 * @param b il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	public int inserisciBrevetto(Brevetto b)throws SQLException;

	/**
	 * RF_1.3 Ricerca prodotti
	 * @param tipologiaProdotto
	 * @param rangeAnnoStart
	 * @param rangeAnnoEnd
	 * @param titoloProdotto
	 * @param nomeRicercatore
	 * @param cognomeRicercatore
	 * @param codiceFiscale
	 * @param idDipartimento
	 * @param idAreaScientifica
	 * @return lista di risultati
	 * @throws SQLException
	 */
	public ArrayList<Prodotto> ricercaProdotti(String tipologiaProdotto,
			int rangeAnnoStart, int rangeAnnoEnd, String titoloProdotto,
			String nomeRicercatore, String cognomeRicercatore,
			String codiceFiscale, String idDipartimento,
			String idAreaScientifica) throws SQLException;

	/**
	 * RF 1.4 Visualizzazione prodotto
	 * @param id 
	 * @return prodotto
	 * @throws SQLException
	 */
	public Prodotto getProdotto(int idProdotto) throws SQLException;

	/**
	 * RF 1.5 modifica prodotto Altro
	 * 
	 * @param ap il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	public boolean modificaAltroProdotto(AltroProdotto ap)throws SQLException;

	/**
	 * RF 1.5 modifica prodotto ArticoloLibro
	 * 
	 * @param al il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	public boolean modificaArticoloLibro(ArticoloLibro al)throws SQLException;

	/**
	 * RF 1.5 modifica prodotto ArticoloRivista
	 * 
	 * @param ar il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	public boolean modificaArticoloRivista(ArticoloRivista ar)throws SQLException;

	/**
	 * RF 1.5 modifica prodotto Monografia
	 * 
	 * @param m il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	public boolean modificaMonografia(Monografia m)throws SQLException;

	/**
	 * RF 1.5 modifica prodotto Curatela
	 * 
	 * @param c il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	public boolean modificaCuratela(Curatela c)throws SQLException;

	/**
	 * RF 1.5 modifica prodotto AttiCongresso
	 * 
	 * @param ac il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	public boolean modificaAttiCongresso(AttiCongresso ac)throws SQLException;

	/**
	 * RF 1.5 modifica prodotto Brevetto
	 * 
	 * @param b il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	public boolean modificaBrevetto(Brevetto b)throws SQLException;

	/**
	 * RF_1.6 Stampa prodotto
	 * @param idProdotto
	 * @return l'url del prodotto
	 * @throws SQLException
	 */
	public String stampaProdotto(int idProdotto) throws SQLException;

	
	/**
	 * RF 1.7 elimina prodotto 
	 * 
	 * @param idProdotto
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	public boolean eliminaProdotto(int idProdotto)throws SQLException;

	/**
	 * RF_1.8 valida il riconoscimento
	 * @param idProdotto
	 * @param idRicercatore
	 * @return true se l'operazione va a buon fine, false altrimenti
	 * @throws SQLException
	 */
	public boolean validaRiconoscimento(int idProdotto, int idRicercatore)
			throws SQLException;

	/**
	 * Controlla conflitti
	 * @param id 
	 * @param titolo
	 * @param tipologia
	 * @param anno
	 * @param url
	 * @return true se c'e conflitto, false altrimenti
	 * @throws SQLException
	 */
	public boolean checkConflitto(int id, String titolo, String tipologia, int anno, String url) throws SQLException;
}
